
require('type')
local class = require('class')
-- 调度器(定时器)
local Scheduler = class()


-- 新的管理器
function Scheduler:createManager()
    return scheduler_create()
end

-- 运行管理器(主循环中调用)
function Scheduler:updateManager(manager)
    if not isPointer(manager) or manager == nullptr then return end
    scheduler_update(manager, Timer_GetDelta())
end

-- 初始化
function Scheduler:init()
    self._ref = ref_create()
 	ref_autorelease(self._ref)
 	ref_retain(self._ref)    
end


-- 设置管理器
function Scheduler:setManager(manager)
    if not isPointer(manager) then return end
    ref_setScheduler(self._ref, manager)
end

local function salfcall(func, ...)
	local ret = { xpcall(func, __gua.traceback, ...) }
	if ret[1] and ret[2] then
        return table.unpack(ret, 2)
	end
	return ret[1]
end

-- 运行(延迟, 间隔, 重复次数, 回调函数, 参数)
-- delay秒之后, 每隔interval秒 运行func函数 重复times次
-- interval 为 0 表示每帧都运行
-- times 为 0 表示无限重复
function Scheduler:schedule(delay, interval, times, func, ... )
    if not isNumber(interval) or not isNumber(delay) or not isNumber(times) or not isFunction(func) then return end
    if times <= 0 then times = 0x7FFFFFFF end
    local t = 0
    local args = { ... }
    return ref_schedule(self._ref, interval, delay, function(dt)
        xpcall(function(delta)
            func(delta, table.unpack(args))
            t = t + 1
            if t >= times then 
                self:unschedule()
            end
        end, __easy.traceback, dt)
    end)    
end

-- 运行对象(延迟, 间隔, 重复次数, 回调函数, 对象, 参数)
function Scheduler:scheduleObject(delay, interval, times, func, object, ...)
    if not isNumber(interval) or not isNumber(delay) or not isNumber(times) or not isFunction(func) then return end
    if times <= 0 then times = 0x7FFFFFFF end
    local t = 0
    local args = { ... }
    return ref_schedule(self._ref, interval, delay, function(dt)
        xpcall(function(delta)
            func(object, delta, table.unpack(args))
            t = t + 1
            if t >= times then 
                self:unschedule()
            end
        end, __easy.traceback, dt)
    end)
end


-- 关闭定时器
function Scheduler:unschedule()
    ref_unschedule(self._ref)
end


function Scheduler:汉化()
    self.创建管理器 = self.createManager
    self.更新管理器 = self.updateManager
    self.设管理器 = self.setManager
    self.运行 = self.schedule
    self.运行对象 = self.scheduleObject
    self.关闭 = self.unschedule
end


return Scheduler